#ifndef SERIAL_COMMAND_HANDLER_H
#define SERIAL_COMMAND_HANDLER_H

#include <Arduino.h>
#include <functional>
#include <vector>
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#include <freertos/semphr.h>
#include "command_executor.h"
#include "mqtt_manager.h"

/**
 * @brief 优化后的串口命令处理器
 * 
 * 主要优化点:
 * 1. 使用命令映射表简化命令查找和分发
 * 2. 按功能分类组织命令处理函数
 * 3. 使用std::function统一命令处理接口
 * 4. 改进错误处理和用户反馈
 * 5. 优化内存使用和代码可维护性
 */
class SerialCommandHandler {
public:
    /**
     * @brief 构造函数 - 简化依赖管理
     * @param executor 命令执行器指针
     * @param mqtt MQTT管理器指针
     * @param drawingPaused 绘图暂停状态指针
     * @param cmdQueue 命令队列句柄
     * @param serialMtx 串口互斥锁句柄
     */
    SerialCommandHandler(
        CommandExecutor* executor,
        MQTTManager* mqtt,
        bool* drawingPaused,
        QueueHandle_t cmdQueue,
        SemaphoreHandle_t serialMtx
    );

    /**
     * @brief 处理串口输入的主函数
     */
    void handleSerialInput();

    /**
     * @brief 获取命令执行器指针
     */
    CommandExecutor* getCommandExecutor();

    // === 兼容性接口 ===
    bool canExecuteMotorCommand(const String& command);
    void saveLastUsedPattern(const String& patternName);
    String loadLastUsedPattern();
    bool loadDefaultOrLastPattern();
    void handleShortPressStartStop();
    
    /**
     * @brief 处理具体的命令字符串 (public接口)
     * @param command 要处理的命令字符串
     */
    void processCommand(const String& command);

private:
    // === 核心组件引用 ===
    CommandExecutor* commandExecutor;
    MQTTManager* mqttManager;
    bool* isDrawingPaused;
    QueueHandle_t commandQueue;
    SemaphoreHandle_t serialMutex;

    /**
     * @brief 命令映射结构体
     */
    struct CommandMapping {
        String command;                           // 命令字符串
        std::function<void(const String&)> handler;  // 处理函数
        String description;                       // 命令描述
    };
    
    std::vector<CommandMapping> commandMappings;

    // === 核心处理函数 ===
    
    /**
     * @brief 初始化命令映射表
     */
    void initializeCommandMappings();
    
    /**
     * @brief 处理命令主逻辑
     * @param command 完整命令字符串
     */
    void processCommand(const String& command);
    
    /**
     * @brief 执行复合命令（带参数的命令）
     * @param cmd 命令名
     * @param params 参数字符串
     */
    void executeCommand(const String& cmd, const String& params);

    // === 分类命令处理函数 ===
    
    /**
     * @brief 处理基础命令 (help, status)
     */
    void handleBasicCommands(const String& command);
    
    /**
     * @brief 处理运动控制命令 (start, stop, home, enable, disable)
     */
    void handleMotionCommands(const String& command);
    
    /**
     * @brief 处理图案相关命令 (next, prev, list, load)
     */
    void handlePatternCommands(const String& command);
    
    /**
     * @brief 处理LED控制命令 (ledon, ledoff, brightness, etc.)
     */
    void handleLEDCommands(const String& command);
    
    /**
     * @brief 处理系统监控命令 (taskinfo, meminfo, etc.)
     */
    void handleSystemCommands(const String& command);

    // === 辅助工具函数 ===
    
    /**
     * @brief 处理命令执行错误
     * @param errorCode 错误码
     * @param context 操作上下文描述
     */
    void handleError(int errorCode, const String& context);
    
    /**
     * @brief 记录命令执行日志
     * @param command 命令字符串
     */
    void logCommand(const String& command);
    
    /**
     * @brief 解析命令参数
     * @param command 命令字符串
     * @return 参数数组
     */
    std::vector<String> parseParameters(const String& command);
    
    /**
     * @brief 解析颜色参数 (r,g,b格式)
     * @param params 参数字符串
     * @param r 红色分量输出
     * @param g 绿色分量输出
     * @param b 蓝色分量输出
     * @return 解析成功返回true
     */
    bool parseColorParameters(const String& params, int& r, int& g, int& b);
    
    /**
     * @brief 解析浮点数参数
     * @param params 参数字符串
     * @param values 输出浮点数数组
     * @return 解析成功返回true
     */
    bool parseFloatParameters(const String& params, std::vector<float>& values);
};

#endif // SERIAL_COMMAND_HANDLER_H